package com.joy.joyusers.service;

import com.baomidou.mybatisplus.extension.service.IService;
import com.joy.joyusers.model.VO.PageVO;
import com.joy.joyusers.model.VO.UserSearchVO;
import com.joy.joyusers.model.domain.User;
import com.joy.joyusers.utils.Response;

import javax.servlet.http.HttpServletRequest;
import java.util.List;

/**
 * @author jason
 * @description 针对表【user(用户表)】的数据库操作Service
 * @createDate 2024-01-27 02:29:45
 */
public interface UserService extends IService<User> {

    /**
     * 用户注册
     *
     * @param account       用户账号
     * @param password      用户密码
     * @param checkPassword 密码校验
     * @return 新用户id
     */
    Response<Long> userRegister(String account, String password, String checkPassword);

    /**
     * 用户登录
     *
     * @param account  账号
     * @param password 密码
     * @return 用户信息
     */
    User doLogin(String account, String password, HttpServletRequest request);

    /**
     * 用户脱敏
     *
     * @param user 用户信息
     * @return 脱敏后的用户信息
     */
    User getSafetyUser(User user);

    /**
     * 根据用户id获取用户信息
     *
     * @param userId 用户id
     * @return 用户信息
     */
    User getUserById(Long userId);


    /**
     * 用户注销
     *
     * @param request
     * @return
     */
    int userLogout(HttpServletRequest request);

    /**
     * 根据用户账号获取用户信息
     *
     * @param email 用户邮箱
     * @return 是否成功发送验证码
     */
    Response<Boolean> getEmailCode(String email);

    /**
     * 忘记密码
     *
     * @param email    用户邮箱
     * @param captcha  验证码
     * @param password 密码
     * @param account  账号
     * @return 是否成功
     */
    Response<Boolean> forgetPassword(String email, String captcha, String password, String account);

    /**
     * 搜索用户
     *
     * @param pageVO       分页信息
     * @param userSearchVO 搜索条件
     * @return 用户信息
     */
    Response<List<UserSearchVO>> getQueryPage(PageVO pageVO, UserSearchVO userSearchVO);

    /**
     * 更新用户信息
     *
     * @param user 用户信息
     * @return 是否成功
     */
    Response<Boolean> updateUser(User user);

    /**
     * 修改用户信息，里面有校验的
     * @param user 传递的前端用户参数
     * @param userInfo 获取的当前登录用户参数
     * @return
     */
    int modifyUser(User user, User userInfo);

    /**
     * 删除用户
     *
     * @param userId 用户id
     * @return 是否成功
     */
    Response<Boolean> deleteUser(Long userId);

    /**
     * 根据标签搜索用户sql的做法
     * @param tagNameList
     * @return
     */
    List<User> searchUserByTags(List<String> tagNameList);

    /**
     * 还有一种该方式就是利用内存来查询
     */
    List<User> searchUserByTags2(List<String> tagNameList);

    /**
     * 获取当前登录用户
     */
    User getCurrentLoginUser(HttpServletRequest request);


    /**
     * 是否为管理员（从当前登录用户中获取）
     *
     * @param request
     * @return
     */
    boolean isAdmin(HttpServletRequest request);

    /**
     * 是否为管理员（传入用户User）
     *
     * @param loginUser
     * @return
     */
    boolean isAdmin(User loginUser);


}
